/*************************************************************************
	> File Name: msgqueue.c
	> Author: Angel Criss
	> Mail: abbytsing@gmail.com 
	> Created Time: Mon 07 Apr 2014 09:23:43 AM CST
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<unistd.h>
#include<stdlib.h>

struct msg_buf 
{
    int type;
    char data[1000];
};

int main(int argc, char *argv[])
{
    key_t key;
    int send;
    int id;
    int recive;
    struct msg_buf databuf;

    system("touch /tmp/key-0309"); //调用系统命令创建一个文件

    key=ftok("/tmp/key-0309",10); //把文件转换为key， 10 只要是一个int 类型的数字即可

    if(key==-1)
    {
        perror("ftok");
        exit(0);
    }

   if((id=msgget(key,IPC_CREAT|00644))==-1) //获取消息队列的key值，没有这个队列就创建
    {
        perror("msgget");
        exit(0);
    }
    
   
   databuf.type=1; //同上，只要是一int型数字即可

   strcpy(databuf.data,argv[1]); //将参数内容复制到 结构体中

   send=msgsnd(id,&databuf,(size_t)sizeof(databuf.data),IPC_NOWAIT); //发送消息 见 man msgsnd
   if(send==-1)
   {
       perror("msgsnd");
       exit(0);
   }

//   memset(&databuf,0,sizeof(databuf));

   recive=msgrcv(id,&databuf,(size_t)sizeof(databuf.data),1,IPC_NOWAIT); //因为用不同的 变量完成发送和接收，所以 上面一句作废, man msgrcv 其中 1 是 46行的databuf.type的内容

   if(recive==-1)
   {
       perror("msgrcv");
       exit(0);
   }
   printf("recived message is: %s\n",databuf.data);
   exit(0);
}
